package com.l.Thread.WaitNotify;

/**
 * 死锁：都互相等待对方的锁标记，都不会释放自己的锁标记
 * 线程通信：
 *     线程通信来解决死锁
 *     等待：wait()：必须在加锁的同步代码块中，会释放所有的锁标记，进入等待的状态中
 *     通知：notify():必须在对obj加锁的同步代码块中，释放一个等待
 *          notifyAll()：必须在对obj加锁的同步代码块中，全部释放
 *
 * @author Mc.Chai
 * @program: Java基础
 * @create 2021-11-13-16:34 16:34
 */
public class TestWaitNotify {
    public static void main(String[] args) {
        Object obj=new Object();
        MyThread myThread=new MyThread(obj);
        myThread.start();
        try {
            Thread.sleep(10000);//主线程sleep
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (obj){
            System.out.println("main进入同步代码块");

            obj.notify();

            System.out.println("main退出同步代码块");
        }
        System.out.println("main结束");
    }
}
class MyThread extends Thread{
    Object obj;

    public MyThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        System.out.println(getName()+"线程启动");
        synchronized (obj){
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(getName()+"线程结束");
    }
}
